package com.credithc.signature.manager.controller;

import com.alibaba.fastjson.JSONObject;
import com.credithc.signature.common.constant.ResponseEnum;
import com.credithc.signature.common.to.CommonResult;
import com.credithc.signature.manager.ro.AdminReq;
import com.credithc.signature.manager.service.AdminService;
import com.credithc.signature.manager.utils.ResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.io.UnsupportedEncodingException;

/**
 * @author hujingbo
 * @date 2020-04-25
 */
@RestController
@RequestMapping("/api/signaturefacade/v1")
@Slf4j
public class AdminController {

    @Autowired
    AdminService adminService;


    /**
     * 请求参数校验
     *
     * @param adminReq
     * @return
     * @throws Exception
     */
    @ResponseBody
    @PostMapping("/manual/verify")
    public Object adminVerify(@RequestBody @Valid AdminReq adminReq) throws UnsupportedEncodingException {
        log.info("行政章[参数校验接口]请求体信息={}", JSONObject.toJSONString(adminReq));

        if (!adminService.verifyTimestamp(adminReq)) {
            return ResponseUtil.getResponseMessageData(ResponseEnum.ILLEGAL_EXPIRE.getCode(), null);
        }
        if (!adminService.verifySignature(adminReq)) {
            return ResponseUtil.getResponseMessageData(ResponseEnum.ILLEGAL_SIGNATURE.getCode(), null);
        }
        return adminService.adminVerify(adminReq);
    }

    /**
     * 执行签章 ---只支持单公章
     *
     * @param adminReq
     * @return
     */
    @ResponseBody
    @PostMapping("/manual/seal")
    public Object adminSeal(@RequestBody @Valid AdminReq adminReq) throws Exception {
        log.info("行政章[执行签章接口]请求体信息={}", JSONObject.toJSONString(adminReq));
        if (!adminService.verifyToken(adminReq)) {
            return ResponseUtil.getResponseMessageData(ResponseEnum.ILLEGAL_TOKEN.getCode(), null);
        }
        return adminService.invoke(adminReq);
    }

    /**
     * 版本回退方法介绍：
     *      1.首次签章：保存请求信息-->根据reSign字段判断: 是否是回退版本之后再次签章：1代表是再次签章，0代表首次签章，
     *      2.保存请求信息时：一个公章代表一个版本，骑缝章代表一个版本，请求信息中版本号为JsonObject中的key值 说明：如果盖了2页的公章（即2个）和一个骑缝章，那么此时的版本号为4，版本为1时代表原始未签章状态的PDF文件
     *      3.版本回退：取上次签章时保存的请求信息，取JsonObject中的key值小于等于当前传过来要回退的版本号的请求信息。然后封装请求信息，重新进行签章。设置fileURL字段的值为签章之后文件地址。签章完成之后保存最新的请求信息和更新版本号
     *      4.再次签章：获取fileURL字段的值，即在上次签章之后的文件基础上，根据传过来的请求信息再次签章。查询数据库，然后将本次签章的请求信息和数据库中已存在的请求信息，保存为一个新的请求信息，同时版本号进行追加。
     */

    /**
     * 执行签章版本回退--只支持单公章
     *
     * @param adminReq
     * @return
     */
    @ResponseBody
    @PostMapping("/manual/seal/revoke")
    public Object adminSealRevoke(@RequestBody AdminReq adminReq) throws Exception {
        log.info("行政章[执行版本回退接口]请求体信息={}", JSONObject.toJSONString(adminReq));
        if (!adminService.verifyToken(adminReq)) {
            return ResponseUtil.getResponseMessageData(ResponseEnum.ILLEGAL_TOKEN.getCode(), null);
        }
        CommonResult commonResult = adminService.verifyParams(adminReq);
        if (!commonResult.getIsSuccess()) {
            return ResponseUtil.getResponseMessageMap(ResponseEnum.ILLEGAL_PARAMS.getCode(), commonResult.getResult().toString());
        }
        return adminService.revoke(adminReq);
    }
}
